package code.classic150on2025;

import java.util.*;

/**
 * @author 26029
 * @date 2025/6/22
 * @description
 */
public class TheHash {
    // 49. 字母异位词分组
    public List<List<String>> groupAnagrams(String[] strs) {
        List<List<String>> lists = new ArrayList<>();
        Map<String, List<String>> map = new HashMap<>();
        for (String s : strs) {
            char[] chars = s.toCharArray();
            Arrays.sort(chars);
            String sorted = Arrays.toString(chars);
            if (!map.containsKey(sorted))
                map.put(sorted, new ArrayList<>());
            map.get(sorted).add(s);
        }
        for (String list: map.keySet()) {
            lists.add(map.get(list));
        }
        return lists;
    }

    // 128. 最长连续序列
    public int longestConsecutive(int[] nums) {
        Map<Integer, Integer> map = new HashMap<>();
        for (int num : nums) {
            if (map.containsKey(num))
                continue;
            if (!map.containsKey(num - 1) && !map.containsKey(num + 1)) {
                // 左右都没有，设为1
                map.put(num, 1);
            } else if (!map.containsKey(num - 1)) {
                // 左没有右有
                int right = map.get(num + 1);
                map.put(num, right + 1);
                map.put(num + right, right + 1);
            } else if (!map.containsKey(num + 1)) {
                // 右没有左有
                int left = map.get(num - 1);
                map.put(num, left + 1);
                map.put(num - left, left + 1);
            } else {
                // 左右都有
                int left = map.get(num - 1), right = map.get(num + 1);
                map.put(num, left + right + 1);
                map.put(num - left, left + right + 1);
                map.put(num + right, left + right + 1);
            }
        }
        int max = 0;
        for (Integer key : map.keySet()) {
            max = Math.max(max, map.get(key));
        }
        return max;
    }
}
